package com.weixiaodong.javabasic.Java中List使用细节;

import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.ArrayList;

public class ListDemo {
    public static void main(String[] args) {
        // 将数组转化为List类型
        String[] strs = {"a", "b", "c"};
        List<String> strings = Arrays.asList(strs);
        // strings.add("d"); // 抛出异常：java.lang.UnsupportedOperationException（不支持的操作异常）为什么这里会报错
        /**
         * 查看Arrays的源码：内部封装了一个ArrayList<T>，即返回的并不是实际的java.util.ArrayList, 而是Arrays类中的内部类ArrayList<T>
         *     这两个类都继承自extends AbstractList<E>, Arrays类中的内部类并没有重写add方法，而AbstractList中的add方法就是会抛出上面
         *     的异常，这就是Arrays中内部的ArrayList不支持add(remove也不支持)的原因
         */
        strings.set(0, "aa");
        System.out.println(strs[0]); // 'aa' 这里就是Arrays中的第二个坑，strings的修改会影响原数组中的值
        // 实际上底层本质还是在使用这个数组中的元素，所以两者会相互影响

        // 问题就是如何解决呢? 非常简单，将Arrays内部的ArrayList转化为java.utils.ArrayList即可
        List<String> container = new ArrayList<>(Arrays.asList(strs));

        List<String> list = Collections.unmodifiableList(container); // 将传入的list变为不可变集合
        System.out.println(list.get(0));
        System.out.println(list.get(1));
        System.out.println(list.get(2));
        // list.add("d"); // 对于不可变集合，无法使用添加，删除，修改等操纵，否则抛出异常 java.lang.UnsupportedOperationException
        list.set(0, "dhadha");

    }
}






















